angular.module("NTApp").factory('DeviceService', function(RESTService) {
  var selectedDevice = '';
  var devicesInfo = [];
  var userDetail = {};
  var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

  function setSelected(device) {
    selectedDevice = device;
  }

  function getSelected() {
    return selectedDevice;
  }

  function setDevicesInfo(devices) {
    devicesInfo = devices;
  }

  function getDevicesInfo() {
    return devicesInfo;
  }

  function setUserDetail(user) {
    userDetail = user;
  }

  function getUserDetail() {
    return userDetail;
  }

  function base64decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;

    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
      /* c1 */
      do {
        c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
      } while (i < len && c1 == -1);
      if (c1 == -1)
        break;

      /* c2 */
      do {
        c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
      } while (i < len && c2 == -1);
      if (c2 == -1)
        break;

      out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

      /* c3 */
      do {
        c3 = str.charCodeAt(i++) & 0xff;
        if (c3 == 61)
          return out;
        c3 = base64DecodeChars[c3];
      } while (i < len && c3 == -1);
      if (c3 == -1)
        break;

      out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

      /* c4 */
      do {
        c4 = str.charCodeAt(i++) & 0xff;
        if (c4 == 61)
          return out;
        c4 = base64DecodeChars[c4];
      } while (i < len && c4 == -1);
      if (c4 == -1)
        break;
      out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
  }

  function CharToHex(str) {
    var out, i, h;
    out = "";
    i = 0;
    while (i < str.length) {
      h = str.charCodeAt(i++).toString(16);
      out += "," + h;
    }
    return out;
  }

  function _16210(str) {
    var result = parseInt(str, 16) / 10;
    return parseFloat(result).toString() == 'Nan' ? '0' : result;
  }

  function getDeviceList(openId) {
    var url = "/api/HavcData/GetUserDevices?openId=" + openId;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  function getDeviceDetail(openId, deviceId, physicalDeviceId) {
    var url = "/api/HavcData/GetAirQuality?openId=" + openId + "&deviceId=" + deviceId + "&physicalDeviceId=" + physicalDeviceId;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  function bindingDevice(openId, physicalDeviceId, deviceName, phoneNumber, address) {
    var url = "/api/HavcData/BindingDevice?openId=" + openId + "&pId=" + physicalDeviceId + "&deviceName=" + deviceName + "&phoneNumber=" + phoneNumber + "&address=" + address;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  function bindingSharedDevice(sourceOpenId, pId, deviceId, shareOpenId, shareCode) {
    var url = "/api/HavcData/ShareCodeBindDevice?sourceOpenId=" + sourceOpenId + "&deviceId=" + pId + "&ableDeviceId=" + deviceId + "&shareOpenId=" + shareOpenId + "&shareCode=" + shareCode;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  function unbinding(openId, pId) {
    var url = "/api/HavcData/UnBindingDevice?openId=" + openId + "&pId=" + pId;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  function setDevice(openId, sendData, physicalDeviceId, deviceId, messageCode) {
    var url = "/api/HavcData/SendToDevice?openId=" + openId + "&sendData=" + sendData + "&physicalDeviceId=" + physicalDeviceId + "&deviceId=" + deviceId + "&mesageCode=" + messageCode;
    return RESTService.get(url).then(function(result) {
      return result.data;
    });
  }

  return {
    setSelected: setSelected,
    getSelected: getSelected,
    setDevicesInfo: setDevicesInfo,
    getDevicesInfo: getDevicesInfo,
    setUserDetail: setUserDetail,
    getUserDetail: getUserDetail,
    base64decode: base64decode,
    CharToHex: CharToHex,
    _16210: _16210,
    getDeviceList: getDeviceList,
    getDeviceDetail: getDeviceDetail,
    bindingSharedDevice: bindingSharedDevice,
    bindingDevice: bindingDevice,
    unbinding: unbinding,
    setDevice: setDevice
  }
});
